package com.chaihu.api.rest;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chaihu.api.service.ApiService;
import com.chaihu.bean.enums.MsgCode;
import com.chaihu.bean.result.ResponseResult;
import com.chaihu.core.base.constants.CommonConstant;
import com.chaihu.core.base.controller.SuperController;
import com.chaihu.utils.exception.BaseException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author chaihu
 * @date 2021/10/13
 */
@Slf4j
@RestController
@RequestMapping(path = "/api")
@Api(value = "对外统一提供服务接口服务")
public class RestApi extends SuperController {
    @Autowired
    private ApiService apiService;

    /**
     * 健康检查 服务
     *
     * @return
     */
    @RequestMapping(path = "/health", method = RequestMethod.GET)
    @ApiOperation(value = "服务健康检查", notes = "test: 返回 2XX 表示服务正常")
    public String health() {
        return "";
    }

    /**
     * 资源请求 post方式
     *
     * @param service  请求接口方式
     * @param postInfo post内容
     * @param request  请求对象 查询头信息 url等信息
     * @return http status 200 成功 其他失败
     */
    @RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
    @ApiOperation(value = "资源post请求", notes = "test: 返回 2XX 表示服务正常")
    @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
    public ResponseEntity<String> servicePost(@PathVariable String service,
                                              @RequestBody String postInfo,
                                              HttpServletRequest request) {
        ResponseEntity<String> responseEntity = null;
        Map<String, String> headers = new HashMap<String, String>();
        log.debug("api：{} 请求报文为：{}", service, postInfo);
        Long timeBegin = System.currentTimeMillis();
        try {
            this.getRequestInfo(request, headers);
            headers.put(CommonConstant.HTTP_SERVICE, service);
            headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST);
            responseEntity = apiService.service(postInfo, headers);
        } catch (BaseException e) {
            log.error("请求get 方法[" + service + "]失败：", e);
            responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(e.getResult()), HttpStatus.OK);
        } catch (Throwable e) {
            log.error("请求post 方法[" + service + "]失败：" + postInfo, e);
            ResponseResult result = new ResponseResult(MsgCode.ERROR.getCode(), "请求发生异常，" + e.getMessage());
            responseEntity = new ResponseEntity<String>(JSON.toJSONString(result), HttpStatus.OK);
        }
        Long cost = System.currentTimeMillis() - timeBegin;
        log.debug("api：{}，api处理完成，cost:{}", service, cost + "ms");
        return responseEntity;
    }

    /**
     * 资源请求 get方式
     *
     * @param service 请求接口方式
     * @param request 请求对象 查询头信息 url等信息
     * @return http status 200 成功 其他失败
     */

    @RequestMapping(path = "/{service:.+}", method = RequestMethod.GET)
    @ApiOperation(value = "资源get请求", notes = "test: 返回 2XX 表示服务正常")
    @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
    public ResponseEntity<String> serviceGet(@PathVariable String service,
                                             HttpServletRequest request) {
        ResponseEntity<String> responseEntity = null;
        Map<String, String> headers = new HashMap<String, String>();
        try {
            this.getRequestInfo(request, headers);
            headers.put(CommonConstant.HTTP_SERVICE, service);
            headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_GET);
            log.debug("api：{} 请求报文为：{},header信息为：{}", "", headers);
            responseEntity = apiService.service(JSONObject.toJSONString(getParameterStringMap(request)), headers);
        } catch (BaseException e) {
            log.error("请求get 方法[" + service + "]失败：", e);
            responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(e.getResult()), HttpStatus.OK);
        } catch (Throwable e) {
            log.error("请求get 方法[" + service + "]失败：", e);
            ResponseResult result = new ResponseResult(MsgCode.ERROR.getCode(), e.getMessage());
            responseEntity = new ResponseEntity<String>(JSON.toJSONString(result), HttpStatus.OK);
        }

        return responseEntity;
    }

    /**
     * 资源请求 put方式
     *
     * @param service  请求接口方式
     * @param postInfo 修改内容
     * @param request  请求对象 查询头信息 url等信息
     * @return http status 200 成功 其他失败
     */

    @RequestMapping(path = "/{service:.+}", method = RequestMethod.PUT)
    @ApiOperation(value = "资源put请求", notes = "test: 返回 2XX 表示服务正常")
    @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
    public ResponseEntity<String> servicePut(@PathVariable String service,
                                             @RequestBody String postInfo,
                                             HttpServletRequest request) {
        ResponseEntity<String> responseEntity = null;
        Map<String, String> headers = new HashMap<String, String>();
        try {

            this.getRequestInfo(request, headers);
            headers.put(CommonConstant.HTTP_SERVICE, service);
            headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_PUT);
            log.debug("api：{} 请求报文为：{},header信息为：{}", service, postInfo, headers);
            responseEntity = apiService.service(postInfo, headers);
        } catch (BaseException e) {
            log.error("请求get 方法[" + service + "]失败：", e);
            responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(e.getResult()), HttpStatus.OK);
        } catch (Throwable e) {
            log.error("请求put 方法[" + service + "]失败：", e);
            ResponseResult result = new ResponseResult(MsgCode.ERROR.getCode(), "请求发生异常，" + e.getMessage());
            responseEntity = new ResponseEntity<String>(JSON.toJSONString(result), HttpStatus.OK);
        }
        log.debug("api：{} 返回信息为：{}", service, responseEntity);
        return responseEntity;
    }

    /**
     * 资源请求 delete方式
     *
     * @param service 请求接口方式
     * @param request 请求对象 查询头信息 url等信息
     * @return http status 200 成功 其他失败
     */

    @RequestMapping(path = "/{service:.+}", method = RequestMethod.DELETE)
    @ApiOperation(value = "资源delete请求", notes = "test: 返回 2XX 表示服务正常")
    @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
    public ResponseEntity<String> serviceDelete(@PathVariable String service,
                                                HttpServletRequest request) {
        ResponseEntity<String> responseEntity = null;
        Map<String, String> headers = new HashMap<String, String>();
        try {

            this.getRequestInfo(request, headers);
            headers.put(CommonConstant.HTTP_SERVICE, service);
            headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_DELETE);
            log.debug("api：{} 请求报文为：{},header信息为：{}", service, "", headers);
            responseEntity = apiService.service(JSONObject.toJSONString(getParameterStringMap(request)), headers);
        } catch (BaseException e) {
            log.error("请求get 方法[" + service + "]失败：", e);
            responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(e.getResult()), HttpStatus.OK);
        } catch (Throwable e) {
            log.error("请求delete 方法[" + service + "]失败：", e);
            ResponseResult result = new ResponseResult(MsgCode.ERROR.getCode(), "请求发生异常，" + e.getMessage());
            responseEntity = new ResponseEntity<String>(JSON.toJSONString(result), HttpStatus.OK);
        }

        log.debug("api：{} 返回信息为：{}", service, responseEntity);
        return responseEntity;
    }

}
